package
{
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Endian;
	import flash.utils.Timer;
	import flash.utils.setInterval;

	public class RollTable extends Sprite
	{
		private var DICES:Array;
		private var RESULT_DICES:Array;
		private var RESULT_ARRAY:Array;
		private var DOUBLE:String = "W"
			
		public static const POTENTIAL_WIN:String = "POTENTIAL_WIN";
		
		private var _rolling:Boolean;
		private var timer:Timer;
		
		[Embed(source="assets/enter.png")]
		private var enter:Class;
		private var es:Sprite; 
			
		public function RollTable()
		{
			timer = new Timer(30, 0);    
			timer.addEventListener(TimerEvent.TIMER, rollDices);

			es = new Sprite();
			es.addChild(new enter());
			es.x = 120;
			es.y = 65;
			this.addChild(es);
			es.buttonMode = true;
			es.addEventListener(MouseEvent.CLICK, enterClicked);
			
			RESULT_ARRAY = new Array();
			RESULT_ARRAY["3"] = "S";
			RESULT_ARRAY["4"] = "P";
			RESULT_ARRAY["5"] = "X";
			RESULT_ARRAY["6"] = "C";
			RESULT_ARRAY["7"] = "T";
			RESULT_ARRAY["8"] = "B";
			RESULT_ARRAY["9"] = "D";
			RESULT_ARRAY["10"] = "M";
			RESULT_ARRAY["11"] = "L";
			
			// c x r
			DICES = [[],[],[]];
			DICES[0][0] = new RandomDice();
			DICES[1][0] = new RandomDice();
			DICES[0][1] = new RandomDice();
			DICES[1][1] = new RandomDice();
			DICES[0][2] = new RandomDice();
			DICES[1][2] = new RandomDice();
			
			RESULT_DICES = [new RandomDice(), new RandomDice(), new RandomDice()];
			
			RandomDice(DICES[0][0]).x = 0;
			RandomDice(DICES[0][0]).y = 0;
			this.addChild(RandomDice(DICES[0][0]));
			
			RandomDice(DICES[1][0]).x = 60;
			RandomDice(DICES[1][0]).y = 0;
			this.addChild(RandomDice(DICES[1][0]));
			
			RandomDice(DICES[0][1]).x = 0;
			RandomDice(DICES[0][1]).y = 60;
			this.addChild(RandomDice(DICES[0][1]));
			
			RandomDice(DICES[1][1]).x = 60;
			RandomDice(DICES[1][1]).y = 60;
			this.addChild(RandomDice(DICES[1][1]));
			
			RandomDice(DICES[0][2]).x = 0;
			RandomDice(DICES[0][2]).y = 120;
			this.addChild(RandomDice(DICES[0][2]));
			
			RandomDice(DICES[1][2]).x = 60;
			RandomDice(DICES[1][2]).y = 120;
			this.addChild(RandomDice(DICES[1][2]));
			
			// result dices
			RandomDice(RESULT_DICES[0]).visible = false;
			RandomDice(RESULT_DICES[0]).x = 150;
			RandomDice(RESULT_DICES[0]).y = 0;
			this.addChild(RandomDice(RESULT_DICES[0]));

			RandomDice(RESULT_DICES[1]).visible = false;
			RandomDice(RESULT_DICES[1]).x = 150;
			RandomDice(RESULT_DICES[1]).y = 60;
			this.addChild(RandomDice(RESULT_DICES[1]));
			
			RandomDice(RESULT_DICES[2]).visible = false;
			RandomDice(RESULT_DICES[2]).x = 150;
			RandomDice(RESULT_DICES[2]).y = 120;
			this.addChild(RandomDice(RESULT_DICES[2]));
		}
		
		private function enterClicked(e:MouseEvent):void
		{
			JungleMania.GAME_STARTED = true;
			if (_rolling)
			{
				stopRollAll();
			}else
			{
				rollAll();
			}
					
		}
		
		public function rollAll():void
		{
			timer.start();
			_rolling = true;
			hideResult();
		}
		
		public function stopRollAll():void
		{
			timer.stop();
			_rolling = false;
			showResult();
		}
		
		private function rollDices(e:Event):void
		{
			var dice:RandomDice = RandomDice(DICES[Math.floor(Math.random()*2)][Math.floor(Math.random()*3)]);
			dice.roll();
		}
		
		private function showResult():void
		{
			es.visible = false;
			
			for (var i:int = 0, len:int = RESULT_DICES.length; i < len; i++)
			{
				var first:uint = RandomDice(DICES[0][i]).diceNumber;
				var second:uint = RandomDice(DICES[1][i]).diceNumber;
				
				if (first == second)
				{
					//double
					RandomDice(RESULT_DICES[i]).setValue(DOUBLE);
				}else
				{
					RandomDice(RESULT_DICES[i]).setValue(RESULT_ARRAY[String(first+second)] as String);
				}
						
				RandomDice(RESULT_DICES[i]).visible = true;
			}			
			//fist row result
			
			dispatchEvent(new Event(POTENTIAL_WIN));
			
		}
		
		public function hideResult():void
		{
			es.visible = true;
			
			for each (var resultDice:RandomDice in RESULT_DICES)
			{
				resultDice.visible = false;
			}
		}
		
		public function get rolling():Boolean 
		{
			return _rolling;
		}
		
		public function getResult():Array
		{
			return RESULT_DICES.map(Util.wrap(takeResult));
		}
		
		private function takeResult(o:Object):String
		{
			return (o as RandomDice).diceValue();
		}
	}
}